#include "wmateriau.h"
#include "ui_wmateriau.h"

WMateriau::WMateriau(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::WMateriau)
{
    ui->setupUi(this);
    _materiau = new Materiaux();

    initialiser();
}

WMateriau::WMateriau(Materiaux& mat, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::WMateriau)
{
    ui->setupUi(this);
    _materiau = &mat;

    initialiser();
}

WMateriau::~WMateriau()
{
    delete ui;
    delete _materiau;
}

void WMateriau::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void WMateriau::initialiser()
{
    this->ui->doubleSpinBox_41->setValue(_materiau->getBrillance());

    //Couleur ambiante
    QPalette palCouleurAmbiante;
    palCouleurAmbiante.setColor(QPalette::Background, _materiau->getCouleurAmbiante());
    this->ui->wCouleurAmbiante->setAutoFillBackground(true);
    this->ui->wCouleurAmbiante->setPalette(palCouleurAmbiante);

    //Couleur diffuse
    QPalette palCouleurDiffuse;
    palCouleurDiffuse.setColor(QPalette::Background, _materiau->getCouleurDiffuse());
    this->ui->wCouleurDiffuse->setAutoFillBackground(true);
    this->ui->wCouleurDiffuse->setPalette(palCouleurDiffuse);

    //Couleur speculaire
    QPalette palCouleurSpeculaire;
    palCouleurSpeculaire.setColor(QPalette::Background, _materiau->getCouleurSpeculaire());
    this->ui->wCouleurSpeculaire->setAutoFillBackground(true);
    this->ui->wCouleurSpeculaire->setPalette(palCouleurSpeculaire);

    //Couleur emission
    QPalette palCouleurEmission;
    palCouleurSpeculaire.setColor(QPalette::Background, _materiau->getCouleurEmission());
    this->ui->wCouleurEmission->setAutoFillBackground(true);
    this->ui->wCouleurEmission->setPalette(palCouleurEmission);

}

void WMateriau::getQColorDiag(QColor &couleur)
{
    bool *diagResult;
    QColorDialog diag;
    diag.setOption(QColorDialog::ShowAlphaChannel, true);

    couleur.setRgba(diag.getRgba(QRgb(), diagResult , this));
}

//On clique sur le bouton couleur ambiante
void WMateriau::on_btonCouleurAmbiante_clicked()
{
    QColor* couleur = &_materiau->getCouleurAmbiante();
    getQColorDiag(*couleur);

    QPalette palCouleurAmbiante;
    palCouleurAmbiante.setColor(QPalette::Background, *couleur);
    this->ui->wCouleurAmbiante->setPalette(palCouleurAmbiante);

    _materiau->setCouleurAmbiante(couleur->redF(), couleur->greenF(), couleur->blueF(), couleur->alphaF());
}

//On clique sur le bouton couleur diffuse
void WMateriau::on_btonCouleurDiffuse_clicked()
{
    QColor* couleur = &_materiau->getCouleurDiffuse();
    getQColorDiag(*couleur);

    QPalette palCouleurDiffuse;
    palCouleurDiffuse.setColor(QPalette::Background, *couleur);
    this->ui->wCouleurDiffuse->setPalette(palCouleurDiffuse);

    _materiau->setCouleurDiffuse(couleur->redF(), couleur->greenF(), couleur->blueF(), couleur->alphaF());
}

//On clique sur le bouton couleur speculaire
void WMateriau::on_btonCouleurSpeculaire_clicked()
{
    QColor* couleur = &_materiau->getCouleurSpeculaire();
    getQColorDiag(*couleur);

    QPalette palCouleur;
    palCouleur.setColor(QPalette::Background, *couleur);
    this->ui->wCouleurSpeculaire->setPalette(palCouleur);

    _materiau->setCouleurSpeculaire(couleur->redF(), couleur->greenF(), couleur->blueF(), couleur->alphaF());
}

//On clique sur le bouton couleur emission
void WMateriau::on_btonCouleurEmission_clicked()
{
    QColor* couleur = &_materiau->getCouleurEmission();
    getQColorDiag(*couleur);

    QPalette palCouleur;
    palCouleur.setColor(QPalette::Background, *couleur);
    this->ui->wCouleurEmission->setPalette(palCouleur);

    _materiau->setCouleurEmission(couleur->redF(), couleur->greenF(), couleur->blueF(), couleur->alphaF());
}

//On finit d'éditer la brillance spéculaire du matériau
void WMateriau::on_doubleSpinBox_41_editingFinished()
{
    float v = this->ui->doubleSpinBox_41->value();
    _materiau->setBrillanceSpeculaire(v);


}


//On appuie sur le bouton annuler
void WMateriau::on_groupBoxOKAnnuler_rejected()
{
    this->close();
}

//On clique sur accepter
void WMateriau::on_groupBoxOKAnnuler_accepted()
{
    //On vérifie que l'on a spécifié un nom
    if(this->ui->lineNomMateriau->text() != "")
    {
        //On crée le chemin du dossier de sauvegarde
        QString mw_cheminExecutable = QCoreApplication::applicationDirPath();
        QString mw_cheminDossierStockage = mw_cheminExecutable + "/ressources/sauvegarde/" + this->ui->lineNomMateriau->text() +".materiau";

        //Sauvegarde du matériau
        {
            std::ofstream ofs(mw_cheminDossierStockage.toAscii().data());
            boost::archive::text_oarchive oa(ofs);
            oa << _materiau;
        }
        this->close();
    }
    else
    {
        QMessageBox::critical(this, "Formulaire incorrect", "Veuillez saisir un nom pour le nouveau materiau");
    }
}
